const secret = require('./secret/')
/**
 * 获取关键的key值。一般作为最外层加解密的密钥
 * aesKey：参考数据。一般用时间戳
 * res：原始的密钥值。限定八位、十六位、三十二位
 * 实际key值至少六位的res(capfer)
 */
const getMainKey = (aesKey, res = 'capfer1119capfer') => {
	var length = res.length
	if (length === 8 || length === 16 || length === 32) {
		aesKey += ''
		if (aesKey) {
			length -= 6 // aesKey中最多的位数
			if (aesKey.length < length) {
				return aesKey + res.substr(aesKey.length * -1)
			}
			return aesKey.substr(length * -1) + res.substr(-6)
		}
		return res
	}
	return ''
}
/**
 * 通过关键AesKey以及特定的key获取常规性的AesKey
 */
const getAesKey = (key, aesKey) => {
	var res = ''
	if (key && aesKey) {
		var length = aesKey.length 
		if (key.length < 3) {
			// 小于三位
			res = key + key + key + aesKey.substr(key.length * -3)
		} else if (key.length > length * 0.5) {
			length *= 0.5
			// 大于aesKey的长度一半
			res = key.substr(0, length) + aesKey.substr(length * -1)
		} else {
			// key + aesKey的后面内容
			res = key + aesKey.substr(key.length - length)
		}
	}
	return res
}
/**
 * 云服务空间中用到的方法
 */
module.exports = {
	getMainKey,
	getAesKey,
	/**
	 * 加密云服务空间信息
	 * 前端解密后却没法获取完整的数据长度，导致解密失败
	 * 对策：只对关键信息加密，不再全部加密了
	 */
	enBasedata(basedata, startTime) {
		if (basedata && startTime) {
			const aesKey = getMainKey(startTime)
			if (0) {
				const jsonstring = JSON.stringify(basedata)
				return secret.aes.en(jsonstring, aesKey)
			}
			basedata = JSON.parse(JSON.stringify(basedata))
			Object.keys(basedata).forEach(key => {
				if (Object.prototype.toString.call(basedata[key]) === '[object Object]' && basedata[key].spaceId) {
					basedata[key] = {
						spaceId: secret.aes.en(JSON.stringify(basedata[key]), getAesKey(key, aesKey))
					}
				}
			})
			return basedata
		}
		return undefined
	},
	/**
	 * 解密云服务空间
	 * 加密云服务空间数据的逆操作
	 */
	deBasedata(basedata, startTime) {
		if (basedata && startTime) {
			const aesKey = getMainKey(startTime)
			if (0) {
				basedata = secret.aes.de(basedata, aesKey)
				// 在这一步实际解析总获取不到完整的数据，导致转对象失败
				basedata = JSON.parse(basedata)
			}
			Object.keys(basedata).forEach(key => {
				if (Object.prototype.toString.call(basedata[key]) === '[object Object]' && basedata[key].spaceId) {
					basedata[key] = JSON.parse(secret.aes.de(basedata[key].spaceId, getAesKey(key, aesKey)))
				}
			})
		}
		return basedata
	},
	/**
	 * 获取当前项目所在的云服务空间名称
	 * @param {String} code 项目代码
	 * @param {Object} space 所有的云服务空间。basedata.space
	 */
	getCurrentTargetSpace(code, space) {
		if (code && space) {
			const arr = Object.keys(space)
			for (let i = 0; i < arr.length; i++) {
				if (space[arr[i]].target) {
					if (Object.keys(space[arr[i]].target).indexOf(code) > -1) {
						// 查询项目所在的服务空间
						return arr[i]
					}
				}
			}
		}
		return undefined
	}
}